<?php

/**
 * 文件安全性校验
 * @param $file
 * @return true
 * @throws Exception
 * create_at: 2025-08-30 09:49:03
 * update_at: 2025-08-30 09:49:03
 */
function checkFileHex($file)
{
    // 解析路径
    $file = str_replace("\\", "/", public_path() . $file);

    if (file_exists($file)) {
        $resource = fopen($file, 'rb');
        $fileSize = filesize($file);
        fseek($resource, 0);

        if ($fileSize > 512) {
            $hexCode = bin2hex(fread($resource, 512));
            fseek($resource, $fileSize - 512);
            $hexCode .= bin2hex(fread($resource, 512));
        } else { // 取全部
            $hexCode = bin2hex(fread($resource, $fileSize));
        }

        fclose($resource);

        // 核心代碼
        /* 匹配16進制中的 <% () %> */
        /* 匹配16進制中的<? () ?> */
        /* 匹配16進制中的 <script | /script> 大小寫均可*/
        $result = preg_match("/(3c25.*?28.*?29.*?253e)|(3c3f.*?28.*?29.*?3f3e)|(3C534352495054)|(2F5343524950543E)|(3C736372697074)|(2F7363726970743E)/is", $hexCode);

        if ($result) {
            @unlink($file);
            throw new \Exception("文件未通过安全性校验：含木马代码");
        }
    }

    return true;
}
